from enum import Enum


class XTP_ACCOUNT_TYPE(Enum):
    XTP_ACCOUNT_NORMAL = 0  # 普通账户
    XTP_ACCOUNT_CREDIT = 1  # 信用账户
    XTP_ACCOUNT_DERIVE = 2  # 期权账户
    XTP_ACCOUNT_UNKNOWN = 3  # 未知账户


class XTP_MARKET_TYPE(Enum):
    XTP_MKT_INIT = 0  # < 初始化值或者未知
    XTP_MKT_SZ_A = 1  # < 深圳A股
    XTP_MKT_SH_A = 2  # < 上海A股
    XTP_MKT_BJ_A = 3  # < 北京A股
    XTP_MKT_HK = 4  # < 港股
    XTP_MKT_UNKNOWN = 5  # < 未知交易市场类型


class XTP_PRICE_TYPE(Enum):
    XTP_PRICE_LIMIT = 1  # < 限价单 - 沪 / 深 / 沪期权 / 深期权 （除普通股票业务外，其余未特指的业务均使用此种类型）
    XTP_PRICE_BEST_OR_CANCEL = 2  # < 即时成交剩余转撤销，市价单 - 深 / 沪期权 / 深期权
    XTP_PRICE_BEST5_OR_LIMIT = 3  # < 最优五档即时成交剩余转限价，市价单 - 沪
    XTP_PRICE_BEST5_OR_CANCEL = 4  # < 最优5档即时成交剩余转撤销，市价单 - 沪深 / 深期权
    XTP_PRICE_ALL_OR_CANCEL = 5  # < 全部成交或撤销, 市价单 - 深 / 沪期权 / 深期权
    XTP_PRICE_FORWARD_BEST = 6  # < 本方最优，市价单 - 深 / 深期权 / 沪科创板
    XTP_PRICE_REVERSE_BEST_LIMIT = 7  # < 对方最优剩余转限价，市价单 - 深 / 沪期权 / 深期权 / 沪科创板
    XTP_PRICE_LIMIT_OR_CANCEL = 8  # < 期权限价申报FOK
    XTP_PRICE_TYPE_UNKNOWN = 9


class XTP_SIDE_TYPE(Enum):
    # 买（新股申购，ETF买，配股，信用交易中担保品买）
    XTP_SIDE_BUY = 1
    # 卖（逆回购，ETF卖，信用交易中担保品卖）
    XTP_SIDE_SELL = 2
    # 申购
    XTP_SIDE_PURCHASE = 7
    # 赎回
    XTP_SIDE_REDEMPTION = 8
    # 拆分
    XTP_SIDE_SPLIT = 9
    # 合并
    XTP_SIDE_MERGE = 10
    # 改版之后的side的备兑，暂不支持
    XTP_SIDE_COVER = 11
    # 改版之后的side锁定（对应开平标识为开） / 解锁（对应开平标识为平）
    XTP_SIDE_FREEZE = 12
    # 融资买入
    XTP_SIDE_MARGIN_TRADE = 21
    # 融券卖出
    XTP_SIDE_SHORT_SELL = 22
    # 卖券还款
    XTP_SIDE_REPAY_MARGIN = 23
    # 买券还券
    XTP_SIDE_REPAY_STOCK = 24
    # 现金还款（不放在普通订单协议，另加请求和查询协议）
    XTP_SIDE_CASH_REPAY_MARGIN = 25
    # 现券还券
    XTP_SIDE_STOCK_REPAY_STOCK = 26
    # 余券划转
    XTP_SIDE_SURSTK_TRANS = 27
    # 担保品转入
    XTP_SIDE_GRTSTK_TRANSIN = 28
    # 担保品转出
    XTP_SIDE_GRTSTK_TRANSOUT = 29
    # 组合策略的组合
    XTP_SIDE_OPT_COMBINE = 31
    # 组合策略的拆分
    XTP_SIDE_OPT_SPLIT = 32
    # 组合策略的管理员强制拆分
    XTP_SIDE_OPT_SPLIT_FORCE = 33
    # 组合策略的交易所强制拆分
    XTP_SIDE_OPT_SPLIT_FORCE_EXCH = 34
    # 未知或者无效买卖方向
    XTP_SIDE_UNKNOWN = 50


class XTP_POSITION_EFFECT_TYPE(Enum):
    # 初始值或未知值开平标识，除期权外，均使用此值
    XTP_POSITION_EFFECT_INIT = 0
    # 开
    XTP_POSITION_EFFECT_OPEN = 1
    # 平
    XTP_POSITION_EFFECT_CLOSE = 2
    # 强平
    XTP_POSITION_EFFECT_FORCECLOSE = 3
    # 平今
    XTP_POSITION_EFFECT_CLOSETODAY = 4
    # 平昨
    XTP_POSITION_EFFECT_CLOSEYESTERDAY = 5
    # 强减
    XTP_POSITION_EFFECT_FORCEOFF = 6
    # 本地强平
    XTP_POSITION_EFFECT_LOCALFORCECLOSE = 7
    # 信用业务追保强平
    XTP_POSITION_EFFECT_CREDIT_FORCE_COVER = 8
    # 信用业务清偿强平
    XTP_POSITION_EFFECT_CREDIT_FORCE_CLEAR = 9
    # 信用业务合约到期强平
    XTP_POSITION_EFFECT_CREDIT_FORCE_DEBT = 10
    # 信用业务无条件强平
    XTP_POSITION_EFFECT_CREDIT_FORCE_UNCOND = 11
    # 未知的开平标识类型
    XTP_POSITION_EFFECT_UNKNOWN = 12


class XTP_BUSINESS_TYPE(Enum):
    XTP_BUSINESS_TYPE_CASH = 0  # 普通股票业务（股票买卖，ETF买卖，沪市交易型货币基金等）
    XTP_BUSINESS_TYPE_IPOS = 1  # 新股申购业务（对应的price_type需选择限价类型）
    XTP_BUSINESS_TYPE_REPO = 2  # 回购业务（国债逆回购业务对应的price_type填为限价，side填为卖）
    XTP_BUSINESS_TYPE_ETF = 3  # ETF申赎业务
    XTP_BUSINESS_TYPE_MARGIN = 4  # 融资融券业务
    XTP_BUSINESS_TYPE_DESIGNATION = 5  # 转托管（未支持）
    XTP_BUSINESS_TYPE_ALLOTMENT = 6  # 配股业务（对应的price_type需选择限价类型, side填为买）
    XTP_BUSINESS_TYPE_STRUCTURED_FUND_PURCHASE_REDEMPTION = 7  # 分级基金申赎业务
    XTP_BUSINESS_TYPE_STRUCTURED_FUND_SPLIT_MERGE = 8  # 分级基金拆分合并业务
    XTP_BUSINESS_TYPE_MONEY_FUND = 9  # 货币基金申赎业务（暂未支持，沪市交易型货币基金的买卖请使用普通股票业务）
    XTP_BUSINESS_TYPE_OPTION = 10  # 期权业务
    XTP_BUSINESS_TYPE_EXECUTE = 11  # 行权
    XTP_BUSINESS_TYPE_FREEZE = 12  # 锁定解锁，暂不支持
    XTP_BUSINESS_TYPE_OPTION_COMBINE = 13  # 期权组合策略组合和拆分业务
    XTP_BUSINESS_TYPE_EXECUTE_COMBINE = 14  # 期权行权合并业务
    XTP_BUSINESS_TYPE_BOND_SWAP_STOCK = 15  # 债转股业务
    XTP_BUSINESS_TYPE_UNKNOWN = 16


class XTP_ORDER_STATUS_TYPE(Enum):
    XTP_ORDER_STATUS_INIT = 0  # 初始化
    XTP_ORDER_STATUS_ALLTRADED = 1  # 全部成交
    XTP_ORDER_STATUS_PARTTRADEDQUEUEING = 2  # 部分成交
    XTP_ORDER_STATUS_PARTTRADEDNOTQUEUEING = 3  # 部分撤单
    XTP_ORDER_STATUS_NOTRADEQUEUEING = 4  # 未成交
    XTP_ORDER_STATUS_CANCELED = 5  # 已撤单
    XTP_ORDER_STATUS_REJECTED = 6  # 已拒绝
    XTP_ORDER_STATUS_UNKNOWN = 7  # 未知订单状态


CUSTOM_MARKET_TYPE_MAP = {
    'sz': XTP_MARKET_TYPE.XTP_MKT_SZ_A.value,
    'sh': XTP_MARKET_TYPE.XTP_MKT_SH_A.value,
    'bj': XTP_MARKET_TYPE.XTP_MKT_BJ_A.value,
    'hk': XTP_MARKET_TYPE.XTP_MKT_HK.value
}

CUSTOM_DIRECTION_TYPE_LONG = 'long'
CUSTOM_DIRECTION_TYPE_SHORT = 'short'

CUSTOM_SIDE_TYPE_BUY = 'buy'
CUSTOM_SIDE_TYPE_SELL = 'sell'
